import 'package:shared_preferences/shared_preferences.dart';

class SpUtils {
  // 单例模式：私有构造函数+静态实例（确保全局唯一）
  SpUtils._();

  static final SpUtils instance = SpUtils._();

  // 缓存SharedPreferences实例，避免重复初始化
  static SharedPreferences? _prefs;

  // 初始化SharedPreferences（确保只执行一次）
  Future<bool> _init() async {
    if (_prefs == null) {
      try {
        _prefs = await SharedPreferences.getInstance();
        return true;
      } catch (e) {
        _prefs = null;
        return false;
      }
    }
    return true;
  }

  /// 存储数据（支持：String/int/double/bool/List<String>）
  /// 返回true：存储成功；false：存储失败（含不支持的类型）
  Future<bool> put(String key, dynamic value) async {
    // 先检查初始化是否成功
    if (!await _init()) {
      return false;
    }

    try {
      if (value is String) {
        return await _prefs!.setString(key, value);
      } else if (value is int) {
        return await _prefs!.setInt(key, value);
      } else if (value is double) {
        return await _prefs!.setDouble(key, value);
      } else if (value is bool) {
        return await _prefs!.setBool(key, value);
      } else if (value is List<String>) {
        return await _prefs!.setStringList(key, value);
      } else {
        // 不支持的类型，主动报错
        return false;
      }
    } catch (e) {
      return false;
    }
  }

  /// 获取数据
  /// [defaultValue]：默认值（key不存在或获取失败时返回）
  Future<dynamic> get(String key,
      [dynamic defaultValue, Function? callback]) async {
    if (!await _init()) {
      return defaultValue;
    }

    try {
      final value = _prefs!.get(key);
      return value ?? defaultValue;
    } catch (e) {
      return defaultValue;
    }
  }

  /// 获取数组
  /// [defaultValue]：默认值（key不存在或获取失败时返回）
  Future<List<String>> getStringList(String key,
      [dynamic defaultValue, Function? callback]) async {
    if (!await _init()) {
      return defaultValue;
    }

    try {
      final value = _prefs!.getStringList(key);
      return value ?? defaultValue;
    } catch (e) {
      return defaultValue;
    }
  }

  /// 移除指定key
  Future<bool> remove(String key) async {
    if (!await _init()) {
      return false;
    }

    try {
      return await _prefs!.remove(key);
    } catch (e) {
      return false;
    }
  }

  /// 清空所有数据
  Future<bool> clear() async {
    if (!await _init()) {
      return false;
    }

    try {
      return await _prefs!.clear();
    } catch (e) {
      return false;
    }
  }
}
